#ifdef CHANGED

#include <time.h>

#include "copyright.h"
#include "bitmap.h"
#include "frameprovider.h"
#include "machine.h"
#include "system.h"


FrameProvider::FrameProvider (int nbelem) {
    DEBUG ('p', "FrameProvider initialise avec %d pages\n", nbelem);
    fp_map = new BitMap (nbelem);
}

//----------------------------------------------------------------------
// BitMap::~BitMap
//      De-allocate a bitmap.
//----------------------------------------------------------------------

FrameProvider::~FrameProvider () {
  // LB: Missing [] in delete directive
  //  delete map;
  delete [] fp_map;
  // End of modification
}

/**
 * si byrand vaut TRUE alors le frame est choisi aléatoirement sinon,
 * le premier frame trouve est retourne
 * GetEmptyFrame() retourne le numero du frame initialisé
 * -1 sinon.
 */
int FrameProvider::GetEmptyFrame (bool byrand) {
	int page = 0;
	bool trouve = false;
	RandomInit(time(NULL));
	if (fp_map->NumClear() > 0) {	// frame disponible ?
		if (byrand) {
			while (!trouve) {
				//printf("random = %d \n", Random()%NumPhysPages);
				page = Random()%NumPhysPages;
				if (!fp_map->Test(page))	trouve = true;
			}
			fp_map->Mark(page);
		}
		else {
			page = NumPhysPages - 1 - fp_map->Find ();
		}
	  	bzero (&(machine->mainMemory[PageSize * page]), PageSize);	// On initialise la page dans le cadre
	  	DEBUG ('p', "Allocation du frame %d, reste %d\n", page, fp_map->NumClear ());
	  return page;
	}
	else
	{
		DEBUG ('p', "FrameProvider : plus de frame disponible.\n");
		return -1;
	}
}


/**
 * ReleaseFrame libere le cadre num
 */
void FrameProvider::ReleaseFrame(int num) {
	if (fp_map->Test(num)) {
		ASSERT (fp_map->Test (num));
		fp_map->Clear(num);
	}
}


/**
 * NumAvailFrame retourne le nombre de cadres disponibles
 */
int FrameProvider::NumAvailFrame ()
{
    return fp_map->NumClear ();
}

#endif // CHANGED
